package day06;

import java.util.concurrent.TimeUnit;

/**
 * @author: 王丹
 * @create: 2021-07-02 22:52
 * T2调用notify方法之后，T1并不能立即继续执行，而是要等待T2释放objec投递锁之后，
 * T1重新成功获取锁后，才能继续执行。因此最后2行日志相差了2秒（因为T2调用notify方法后休眠了2秒）。
 * 注意：Object.wait()方法和Thread.sleeep()方法都可以让现场等待若干时间。除wait()方法可以被唤醒外，
 * 另外一个主要的区别就是wait()方法会释放目标对象的锁，而Thread.sleep()方法不会释放锁。
 **/
public class Demo06 {
    static Object object = new Object();

    public static class T1 extends Thread {
        @Override
        public void run() {
            synchronized (object) {
                System.out.println(System.currentTimeMillis() + ":T1 start!");
                System.out.println(System.currentTimeMillis() + ":T1 wait for object!");
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(System.currentTimeMillis() + ":T1 end!");
            }

        }

    }

    public static class T2 extends Thread {
        @Override
        public void run() {
            synchronized (object) {
                System.out.println(System.currentTimeMillis() + ":T2 start!");
                object.notifyAll();
                System.out.println(System.currentTimeMillis() + ":T2 end!");
            }

        }
    }

    public static void main(String[] args) {
        //new T1().start();
        //new T2().start();
        int aa = 3 | 4;
        System.out.println("aa = " + aa);
    }
}
